package com.zhisheng.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.zhisheng.pojo.MyResponseResult;
import com.zhisheng.utils.MyJwtUtils;
import com.zhisheng.utils.MyThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * 创建者： 智晟全哥
 */

@Component
public class MyLoginInteceptor implements HandlerInterceptor {

    @Autowired
    private MyJwtUtils jwtUtils;

    // 该方法每次浏览器请求的时候,只要路径对上号就会执行1次,返回true代表放行,返回false代表阻止放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("我们自定义的spring的拦截器执行了......................................................");
//2: 根据请求头 Token 获取令牌
        String token = request.getHeader("Token");
        // 3: 校验令牌是否合法,如果合法则放行
        Map<String, Object> map = jwtUtils.parseJwt(token);
        if(map == null){
            // 说明令牌过期了或者不合法,直接响应一个错误信息即可
            // 为了保持前后端请求响应的规范,这里需要创建一个统一结果对象
            MyResponseResult<Object> result = MyResponseResult.error("NOT_LOGIN");
            // 把result响应给前端;(需要把对象转json) 由于目前代码还没有执行controller,因此需要我们自己手动转成json,并手动响应数据
            String jsonString = JSONObject.toJSONString(result);
            response.getWriter().println(jsonString);
            return false;
        }
        // 合法的情况  先使用ThreadLocal  本地线程保存一个变量,以便于后续使用
        MyThreadLocalUtils.setValue(map);
        return true;
    }
}
